#include<iostream>
#include<string>
#include<cstdio>
#include<string.h>
#include<errno.h>
#include<cstdlib>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>
using namespace std;

void fun()
{
  cout<<"hello world"<<endl;
  //exit(100);
  _exit(23);
}

int main()
{  
  pid_t id=fork();
  if(id<0)
  {
    printf("errno:%d,errstring:%s\n",errno,strerror(errno));
    return errno;
  }
  //子进程
  else if(id==0)
  {
    int cut=5;
    while(cut)
    {
      printf("子进程运行中，pid：%d\n",getpid());
      cut--;
      sleep(1);
    }
    //子进程将自己的代码跑完直接退出，设置代码块
    //子进程退出的时候，可以使用全局变量来获取退出码吗？----答案是不行的
    exit(1);
  }
  //父进程
  else 
  {
    int status=0;
    //这个和wait的作用是相同的，等待指定子进程
    pid_t rid=waitpid(id,&status,0);
    //回收子进程状态
    if(rid>0) //等待成功
      printf("wait sub process success,rid:%d,status code:%d,status Signal:%d\n",rid,(status>>8)&0xFF,status&0x7F);
    //等待失败
    else
    {
      perror("waitpid");
    }
    while(true)
    {
      printf("我是父进程，pid：%d\n",getpid());
      sleep(1);
    }
  }
  fun();
  cout<<"进程正常退出"<<endl;
  for(int i=0;i<200;i++)
  {
    cout<<"code :"<<i<<", errstring: "<<strerror(i)<<endl;
  }
  printf("errno:%d,errstring:%s\n",errno,strerror(errno));
  FILE* fp=fopen("./log.txt","r");
  //open fail
  if(fp==nullptr)
  {
    printf("errno:%d,errstring:%s\n",errno,strerror(errno));
    return errno;
  }
  return 0;
}
